package com.baseweb.webadmin.weixin.pay;

import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jdom.JDOMException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baseweb.webadmin.weixin.sign.PaySign;
import com.baseweb.webadmin.weixin.utils.Commons;
import com.baseweb.webadmin.weixin.utils.Constant;
import com.baseweb.webadmin.weixin.utils.HttpGetOrPost;
import com.baseweb.webadmin.weixin.utils.XMLParseUtil;
import com.baseweb.webadmin.weixin.utils.XmlDataHandler;

/**
 * 微信支付，获取支付时需要的数据
 * @author wucc
 *
 */
public class PayInterfaceData {
	private static Logger  logeer=LoggerFactory.getLogger(PayInterfaceData.class);
	/**
	 * 获取微信支付签名的最终数据
	 * @return
	 * @throws JDOMException 
	 * @throws IOException 
	 */
	public Map<String,String> getPaySignaData(HttpServletRequest request,OrderData orderData) throws IOException, JDOMException{

		//session中获取微信用户的唯一标识
		 logeer.info("PayInterfaceData  start  sessionId"+request.getSession().getId());
		 String openid =  (String) request.getSession().getAttribute(Constant.OPENID);
		 logeer.info("微信支付  openid:"+openid);
		//第二次签名：调用统一下单接口，生成订单信息 获取prepay_id 即签名需要使用的package
		orderData.setRemoteAddr(request.getRemoteAddr());
		String prepayId = getPrepayId(openid,orderData);
		logeer.info("微信支付  prepayId:"+prepayId);
         
		//第三次签名：获取调用微信支付时需要的签名paySign  最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。
		Map<String,String> params = new TreeMap<String,String>();
		params.put("appId", Constant.WX_APPID);
		params.put("timeStamp",Commons.create_timestamp());
		params.put("nonceStr", Commons.create_nonce_str());
		params.put("package", "prepay_id="+prepayId);
		params.put("signType", "MD5");
		
		String paySign =  PaySign.createSign(params);
		params.put("paySign", paySign);
		logeer.info("第三次签名：paySign:"+paySign);
		logeer.info("第三次签名的相关数据遍历开始--->:");
		for (Map.Entry entry : params.entrySet()) {
			logeer.info(entry.getKey() + ", " + entry.getValue());
		}	
		logeer.info("第三次签名的相关数据遍历结束--->:end");
		  //获取用户的微信版本号
		 String userAgent = request.getHeader("user-agent");
	     char agent = userAgent.charAt(userAgent.indexOf("MicroMessenger")+15);
	     params.put("agent", new String(new char[]{agent}));//微信版本号，用于前面提到的判断用户手机微信的版本是否是5.0以上版本。
		return params;
	}
	
	//1生成订单信息 获取prepay_id
		/***
		 * 获取prepay_id 
		 * @return
		 * @throws IOException 
		 * @throws JDOMException 
		 */
		private  String   getPrepayId (String openid,OrderData orderData) throws IOException, JDOMException{
			  logeer.info("订单的价格"+orderData.getTotalFee()+"订单号"+orderData.getOrderNum());
		
		      //将参数转换为xml数据格式
		      XmlDataHandler reqHandler = new XmlDataHandler();
		      reqHandler.setParameter("appid", Constant.WX_APPID);
		      reqHandler.setParameter("mch_id", Constant.WX_MCH_ID);
		      reqHandler.setParameter("device_info", "WEB");
		      reqHandler.setParameter("nonce_str", Commons.getRandomString(30));//随机字符串  
		      reqHandler.setParameter("body",  orderData.getBody());//商品描述 
		      reqHandler.setParameter("out_trade_no", orderData.getOrderNum());//商品订单号
		      reqHandler.setParameter("total_fee",orderData.getTotalFee());//订单价格 分
		      reqHandler.setParameter("spbill_create_ip", orderData.getRemoteAddr());//提交用户的ip
		      reqHandler.setParameter("notify_url", orderData.getNotifyUrl());// 接收微信支付成功异步通知回调地址
		      reqHandler.setParameter("trade_type", "JSAPI");//为网页支付JSAPI 时 openid必填
		      
		      //openid获得认证的用户唯一标志      String openid  =  openid;
		      logeer.info("getPrepayId openid "+openid);
		      reqHandler.setParameter("openid",openid);
		      logeer.info("getPrepayId openid "+reqHandler.getParameter("openid"));
		      String  xmlData =   reqHandler.getXmlData();
		      logeer.info("需要传递的数据xmlData:"+xmlData);

			  //请求接口获取返回的数据xml格式：
		      Map  orderMap = XMLParseUtil.doXMLParse(HttpGetOrPost.sendPost(xmlData)); 
		      logeer.info("请求微信统一下单接口后得到的orderMap:"+orderMap);
			  String prepay_id = (String) orderMap.get("prepay_id");
			  return prepay_id;
		}
}
